package ar.edu.caece.pl.asin.model.impl;

import ar.edu.caece.pl.alex.model.IToken;
import ar.edu.caece.pl.alex.model.impl.Token;
import ar.edu.caece.pl.asin.manager.IAnalizadorSintactico;
import ar.edu.caece.pl.asin.manager.impl.AbstractAnalizadorSintactico;
import ar.edu.caece.pl.asin.model.ITokenStream;

public class Else extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {
	
	/* INICIALIZACION */	
	public Else ( ITokenStream ts ) {
		super(ts, false);
	}
	public Else ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/** 
	 * Devuelve true si reconoce un bloque else
	 */
	public boolean reconocer () {

		boolean recognized = true; //(asumimos correctitud hasta demostrar lo contrario)
		
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "Reconocer <ELSE>:", this.getTokenSiguiente() );		//TODO pasarlo a accion semantica
		//----------------------------------------------
		
		/* <ELSE> -> ELSE <SENTENCIA> | 
         *           LAMBDA			 */
		
		if ( this.getTokenSiguiente().equals(new Token(IToken.PALABRA_RESERVADA_ELSE) ) ) {

			// <ELSE> → ELSE <SENTENCIAS>
			
			//----------------------------------------------
			//Agrego info de debug de la produccion
			em.debug( "<ELSE> -> ELSE <SENTENCIA>", this.getTokenSiguiente() );		//TODO pasarlo a accion semantica
			//----------------------------------------------
			
			// Reconocer ELSE
			this.reconocerToken(IToken.PALABRA_RESERVADA_ELSE);
			
			// Reconocer varias <SENTENCIA>
			while ( Sentencia.primeros( this.getTokenSiguiente() ) ) {
				
				IAnalizadorSintactico sentencia = new Sentencia(this.tokenStream, this.debugMode);
				recognized &= sentencia.reconocer();
			}
		}
			
		return recognized;
	}
}
